// 论坛主题
// by indraw 2013.02.01
package bbs

import (
    "strings"
    "strconv"
    "utils/mgo/bson"
    "utils/util"
    "regexp"
	"encoding/hex"
    "time"
    //"fmt"
)

//用户分组
type Thread struct{
    Dao
    ThreadData
}

//论坛动作
type ThreadData struct{
    Tid bson.ObjectId "_id"   //帖子id
    Fid int   //板块ID
    Icon int   //图标
    Type  string    //帖子类型 'thread','level','order','ask','vote','direct'
                 //0,1,2,3,4,5
    Sortid int       //主题分类
    Readlevel int      //阅读等级分
    Readreply  int   //回复浏览
    Readorder  int   //购买查看
    Askprice  int  //悬赏分数
    Asktime  int   //有效时间
    Askstate int  //悬赏状态
    Plugintype int //插件类型
    Username string //发表人
    Userid  string    //发表人id
    Subject string  //主题
    
    //Createtime int  //发表时间
    Lastuserid string  //最后回复人
    Lastusername string  //最后回复人姓名
    Lasttime int  //最后回复时间
    Views int  //查看次数
    Todayviews int  //今天查看次数
    Replies int  //回复数
    Order int  //显示排序
    Highlight string  //高亮显示
    Attachment string  //是否有附件
    Rate int  //评分总数

    Flower int  //鲜花
    Egg int  //鸡蛋
    Islock int  //是否锁定
    Ispith int  //是否精华
    Istop int  //是否置顶
    Ischeck int  //是否审核

    Isanonymous int  //是否匿名
    Optid int  //操作id
    Optinfo string  //操作原因
	Status int    //帖子状态
	
	
    
}

/**
 * 初始化对象
 *
 * author: indraw
 * date: 2013-02-11
 */
func newThread() *Thread {
    
    c := &Thread{
        Dao{
            c:db.C("thread"),
        },
        ThreadData{
		    Tid:bson.NewObjectId(),    //帖子id
		    Fid:0,   //板块ID
		    Icon:0,   //图标
		    Type:"thread",    //帖子类型  'thread','level','order','ask','vote','direct'
		    Sortid:0,      //主题分类
		    Readlevel:0,     //阅读等级分
		    Readreply:0,   //回复浏览
		    Readorder:0,   //购买查看
		    Askprice:0,  //悬赏分数
		    Asktime:0,   //有效时间
		    Askstate:0,  //悬赏状态
		    Plugintype:0, //插件类型
		    Username:"", //发表人
		    Userid:"",    //发表人id
		    Subject:"",  //主题
		    
		    //Createtime:0,  //发表时间
		    Lastuserid:"",  //最后回复人
		    Lastusername:"",  //最后回复人姓名
		    Lasttime:int(time.Now().Unix()),  //最后回复时间
		    Views:0,  //查看次数
		    Todayviews:0,  //今天查看次数
		    Replies:0,  //回复数
		    Order:0, //显示排序
		    Highlight:"",  //高亮显示
		    Attachment:"",  //是否有附件
		    Rate:0,  //评分总数
		
		    Flower:0,  //鲜花
		    Egg:0, //鸡蛋
		    Islock:0,  //是否锁定
		    Ispith:0,  //是否精华
		    Istop:0,  //是否置顶
		    Ischeck:0,  //是否审核
		
		    Isanonymous:0,  //是否匿名
		    Optid:0,  //操作id
		    Optinfo:"",  //操作原因
			Status:1,    //帖子状态
        },
    }
    return c
}

/**
 * 设置帖子ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) setTid( tid string ) {
    
    if m, _ := regexp.MatchString("^[a-zA-Z0-9]+$", tid); !m {
        t.newError("请填写帖子ID:" + tid)
        return
    }
    t.Tid = bson.ObjectIdHex(tid)
}

/**
 * 设置帖子ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) getTid() ( string ) {
    
    return hex.EncodeToString([]byte(t.Tid))
}

/**
 * 设置板块ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) setFid( fid string ) {
    
    if m := util.CheckNumber(fid); !m {
        t.newError("请填写板块ID")
        return
    }
    t.Fid,_ = strconv.Atoi(fid)
}

/**
 * 设置板块ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) getFid( ) string {
    

    return strconv.Itoa(t.Fid)
}


/**
 * 设置分类ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) setSortid( sortid string ) {
    
    if m := util.CheckNumber(sortid); !m {
        t.newError("请填写分类ID")
        return
    }
    t.Sortid,_ = strconv.Atoi(sortid)
}

/**
 * 设置分类ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) setIcon( icon string ) {
    
    if m := util.CheckNumber(icon); !m {
        t.newError("请填写主题图标")
        return
    }
    t.Icon,_ = strconv.Atoi(icon)
}

/**
 * 设置用户ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) setUserid( userid string ) {
    
    if m, _ := regexp.MatchString("^[a-zA-Z0-9]+$", userid); !m {
        t.newError("请填写userid")
        return
    }
    t.Userid = userid
}

/**
 * 设置用户Name
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) setUsername( username string ) {
    
    username = strings.TrimSpace(username)
    if m := util.CheckLen(username,3); !m {
        t.newError("请填写用户名" + username)
        return
    }
    t.Username = username

}

/**
 * 设置用户Name
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) setSubject( subject string ) {
    
    subject = strings.TrimSpace(subject)
    if m := util.CheckLen(subject,6); !m {
        t.newError("请填写标题，不可少于6个字符:")
        return
    }
    if m := util.CheckLenMax(subject,60); !m {
        t.newError("请填写标题，不可少大于60个字符:")
        return
    }
    
    t.Subject = subject

}

/**
 * 设置用户ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) setLastuserid( lastuserid string ) {
    
    if m, _ := regexp.MatchString("^[a-zA-Z0-9]+$", lastuserid); !m {
        t.newError("请填写userid")
        return
    }
    t.Lastuserid = lastuserid
}

/**
 * 写入数据库
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) add() error {
    
    //判断错误
    if err := t.ckError(); err != nil {
        return err
    }

    //执行写入
    if  err := t.c.Insert(&t.ThreadData); err != nil {
        return err
    }
    return nil
}

/**
 * 获取一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) get() error {
    //判断错误
    if err := t.ckError(); err != nil {
        return err
    }

    //执行
    if  err := t.c.Find(bson.M{"_id": t.Tid}).One(&t.ThreadData); err != nil {
        return err
    }
    return nil

}

/**
 * 分页获取记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) list(page *util.PageMaker) []ThreadData {
    //fmt.Println("user.go")
    //判断是否重复
    var l []ThreadData
    t.c.Find(bson.M{"fid": t.Fid}).Sort("-lasttime").Skip(page.Begin).Limit(page.PerPage).All(&l)
    
    return l
    
}


/**
 * 删除一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) count() int {
    var n int
    n,err := t.c.Find(bson.M{"fid": t.Fid}).Count()
    if err != nil{
        n = 0
    }
    
    return n
}

/**
 * 获取前多少条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) top() []ThreadData {
    var l []ThreadData
    t.c.Find(nil).Sort("_id").All(&l)

    return l
}

/**
 * 更新一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) update() error {
    //fmt.Println("user.go")
    
    return nil
}


/**
 * 更新一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) updateLastpost() error {
    //fmt.Println(t.Lastusername)
    //if()
    

    t.c.Update(bson.M{"_id": t.Tid}, bson.M{"$inc": bson.M{"replies": 1},"$set": bson.M{"lastuserid":t.Lastuserid,"lastusername":t.Lastusername,"lasttime":int(time.Now().Unix())}})

    
    return nil
}

/**
 * 更新一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) updateViews() error {

    //fmt.Println("tid")
    //fmt.Println(t.Tid)
    t.c.Update(bson.M{"_id": t.Tid}, bson.M{"$inc": bson.M{"views": 1} })

    
    return nil
}


/**
 * 删除一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (t *Thread) delete() error {
    //fmt.Println("user.go")
    
    return nil
}


